import axios from 'axios'
import qs from 'qs'
// 定义请求类
class Request {
  constructor (config = {}) {
    // 全局公共配置
    this.config = config
    // 创建一个请求对象
    this.service = axios.create(config)
    // 绑定响应拦截和请求拦截
    this.bindInterceptors()
  }

  // 绑定请求拦截和响应拦截
  bindInterceptors () {
    // 请求拦截
    this.service.interceptors.request.use(config => { // 请求拦截
      return config
    }, error => { return Promise.reject(error) })

    // 响应拦截
    this.service.interceptors.response.use(res => {
      // 响应拦截 200-300 304
      return res.data
    }, error => {
      // 其他的响应码 4XX 5XX
      return Promise.reject(error)
    })
  }

  // 封装各种请求方法
  // 基本request，保留axios的request
  request (option) {
    return this.service.request(option)
  }

  // get方法 data数据对象
  get (url, data = {}) {
    return this.service.request({
      url,
      params: data
    })
  }
   // put方法 data数据对象
   put (url, data = {}) {
    return this.service.request({
      method: 'put',
      url,
      params: data
    })
  }
  delete (url, data = {}) {
    return this.service.request({
      method: 'delete',
      url,
      params: data
    })
  }
  // post方法 data数据对象
  post (url, data = {}) {
    return this.service.request({
      method: 'post',
      url,
      data: qs.stringify(data), // 发送表单参数
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      }
    })
  }

  // restFull风格 get 方法 {id : 9197}  /api/9197
  restFullGet (url, id) {
    return this.service.get(url + '/' + id)
  }

  // restFull删除  {id : 9197 } /api/9197
  restFullDelete (url, id) {
    return this.service.delete(url + '/' + id)
  }

  // 文件上传
  upload (url, formData, callback = function () {}) {
    return this.service.request({
      url,
      data: formData,
      method: 'post',
      headers: {
        'Content-Type': 'multipart/form-data'
      },
      onUploadProgress: callback // 上传进度
    })
  }
}

export default Request
